package com.itfreer.ui;

import android.app.Activity;
import android.content.Context;

import com.itfreer.utils.config.ConfigManager;

import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;

/**
 * 定义当前程序集
 */
public class Application extends android.app.Application {

    /**
     * 对外提供整个应用生命周期的Context
     */
    private static Context instance;
    /**
     * 整个应用全局可访问数据集合
     */
    private static Map<String, Object> gloableData = new HashMap<String, Object>();
    /**
     * 寄存整个应用Activity
     */
    private final Stack<WeakReference<Activity>> activitys = new Stack<WeakReference<Activity>>();

    private final static int maxCount = 10;

    /**
     * 对外提供Application Context
     * @return
     */
    public static Context gainContext() {
        return instance;
    }

    public void onCreate() {
        super.onCreate();
        instance = this;

        //设置基础的容器对象
        ConfigManager.setContext(instance);
    }

    /**
     * 往Application放置数据（最大不允许超过x个）
     * @param strKey 存放属性Key
     * @param strValue 数据对象
     */
    public static void setGloableData(String strKey, Object strValue) {
        if (gloableData.size() > maxCount) {
            throw new RuntimeException("超过允许最大数");
        }
        gloableData.put(strKey, strValue);
    }

    /**
     * 从Applcaiton中取数据
     * @param strKey 存放数据Key
     * @return 对应Key的数据对象
     */
    public static Object getGloableData(String strKey) {
        return gloableData.get(strKey);
    }

    /*
     * 从Application中移除数据
     */
    public static void removeGloableData(String key){
        if(gloableData.containsKey(key)) gloableData.remove(key);
    }

    /**
     * 将Activity压入Application栈
     * @param task 将要压入栈的Activity对象
     */
    public  void pushTask(WeakReference<Activity> task) {
        activitys.push(task);
    }

    /**
     * 将传入的Activity对象从栈中移除
     * @param task
     */
    public void removeTask(WeakReference<Activity> task) {
        activitys.remove(task);
    }

    /**
     * 根据指定位置从栈中移除Activity
     * @param taskIndex Activity栈索引
     */
    public void removeTask(int taskIndex) {
        if (activitys.size() > taskIndex)
            activitys.remove(taskIndex);
    }

    /**
     * 将栈中Activity移除至栈顶
     */
    public void removeToTop() {
        int end = activitys.size();
        int start = 1;
        for (int i = end - 1; i >= start; i--) {
            if (!activitys.get(i).get().isFinishing()) {
                activitys.get(i).get().finish();
            }
        }
    }

    /**
     * 移除全部（用于整个应用退出）
     */
    public  void removeAll() {
        //finish所有的Activity
        for (WeakReference<Activity> task : activitys) {
            if (!task.get().isFinishing()) {
                task.get().finish();
            }
        }
    }
}